Firmware includes machine readable instructions that interface directly with the computing hardware. During boot up, the firmware is typically read from a nonvolatile memory source. The firmware sets up the hardware and a firmware interface so that control of the system can be passed to the operating system. At runtime, when the operating system is in control of the computer, the firmware provides additional services to the operating system.
Firmware may be divided into a series of modules. These modules may be helpful for developing firmware because the modules encapsulate sets of instructions to perform more complex tasks. These modules may be used across diverse computing platforms to reduce development time and effort. However, the various computing platforms may need to execute the modules in a specific order or after completion of other modules or executables. Additionally, the computing platforms may use different addressing techniques that need to be accommodated by the firmware. To accommodate these different platform dependencies, a firmware developer may customize one or more of the modules for each of the different computing platforms. However, this customization can be undesirable for several reasons. Creating multiple versions of the firmware modules is expensive and the new firmware modules have a much greater chance of containing an error or creating conflicts with the hardware or other modules. Additionally, updating the multiple versions of the firmware modules can be laborious and may create additional errors. It is desirable to abstract the execution and/or function of a firmware module without altering source code in the shared module itself.
Throughout the drawings, identical reference numbers designate similar, but not necessarily identical, elements.